package cl.tinet.trainee;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.w3c.dom.ls.LSInput;

import cl.tinet.trainee.bean.CarroBeanLocal;
import cl.tinet.trainee.bean.CarroDetalleBeanLocal;
import cl.tinet.trainee.bean.ProductoBeanLocal;
import cl.tinet.trainee.bean.UsuarioBeanLocal;
import cl.tinet.trainee.dto.CarroDTO;
import cl.tinet.trainee.dto.CarroDetalleDTO;
import cl.tinet.trainee.dto.ProductoCarroDTO;
import cl.tinet.trainee.dto.ProductoDTO;
import cl.tinet.trainee.dto.UsuarioDTO;

@ManagedBean
@SessionScoped
public class CarroMB implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@EJB
    private UsuarioBeanLocal usuarioBeanLocal;
	@EJB
	private ProductoBeanLocal productoBeanLocal;
	@EJB
	private CarroDetalleBeanLocal carroDetalleBeanLocal;
	@EJB
	private CarroBeanLocal carroBeanLocal;
	
	private List<UsuarioDTO> listaUsuario;
	private List<ProductoDTO> listaProducto;
	private List<CarroDetalleDTO> listaCarritoCompra=new ArrayList<CarroDetalleDTO>();
	private List<ProductoDTO> listaProductoCarrito=new ArrayList<ProductoDTO>();
	private List<ProductoCarroDTO> listaProductoCarro=new ArrayList<ProductoCarroDTO>();
	private CarroDTO carroDto=new CarroDTO();
	private UsuarioDTO usuarioDto;
	private CarroDetalleDTO carroDetalleDto=new CarroDetalleDTO();
	private UsuarioDTO usuarioLogeado=new UsuarioDTO();
	int cantidad;
	int total;
	
	@PostConstruct
	public void init(){

		obtenerProductos();
    }
	
	public void  obtenerProductos(){
		listaProducto = new ArrayList<ProductoDTO>();
		listaProducto = productoBeanLocal.listarProductos();
		usuarioDto= new UsuarioDTO();
	}
	
	public void ingresar(){
		FacesContext context = FacesContext.getCurrentInstance();
		    boolean logeado= false;
		    usuarioLogeado = new UsuarioDTO();
		    
		    usuarioLogeado = usuarioBeanLocal.verificarUsuario(usuarioDto.getNombreUsuario(),usuarioDto.getPass());
		   
		    if(usuarioLogeado ==null){
		    	logeado= false;
		    	context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuario no Existe", ""));
		    }else if(usuarioLogeado.getNombreUsuario().equals(usuarioDto.getNombreUsuario())){
		    	if(usuarioLogeado.getPass().equals(usuarioDto.getPass())){
		    		logeado=true;
		    	}else{
		    		context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, "Nombre de usuario o password incorrecta.", ""));
		    		logeado=false;
		    	}
		    }
		     if(logeado){
		    	 context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuario logeado", ""));
		     }
		    this.volver();
	}
		
	
	public void registrarUsuario(javax.faces.event.ActionEvent event){
		FacesContext context = FacesContext.getCurrentInstance();
		if(usuarioBeanLocal.verificarUsuarioExistente(usuarioDto)){
			context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuario ya existe", ""));
		}else{
			usuarioBeanLocal.registarUsuarioNuevo(usuarioDto);
			context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuario Registrado Exitosamente", ""));
		}
		
	}
	
	public void agregarProductoCarro(ProductoDTO producto){
		total=0;
		boolean encontro=false;
		carroDetalleDto=new CarroDetalleDTO();
		
//		cuenta la cantidad de productos del  mismo tipo si ya esta ingresado al carrito
        		for (CarroDetalleDTO carroDetalleDTO : listaCarritoCompra) {
        			if(carroDetalleDTO.getIdProducto().equals(producto.getCod_producto())){
        				carroDetalleDTO.setCantidad(carroDetalleDTO.getCantidad()+1);
        				contarProducto();
        				encontro=true;
        			}
				}
//        		si el producto es ingresado por primera vez 
        	    if(encontro==false){
        	    	carroDetalleDto.setIdProducto(producto.getCod_producto());
                	carroDetalleDto.setCantidad(1);
                	listaCarritoCompra.add(carroDetalleDto);
                	contarProducto();
        	    }
        	    
        calcularTotal();
	}
	
	public void contarProducto(){
		cantidad=cantidad+1;
	}
	
	public void calcularTotal(){
		for(CarroDetalleDTO carroDetalleDTO: listaCarritoCompra){
			for(ProductoDTO lisProductoDTO: listaProducto) {
				if(carroDetalleDTO.getIdProducto().equals(lisProductoDTO.getCod_producto())){
					total=total+(lisProductoDTO.getPrecio()*carroDetalleDTO.getCantidad());
				}
		    }
			
		}
	}

	public String editarCarro(){
		boolean encontro=false;
		ProductoDTO productoDto=new ProductoDTO();
		ProductoCarroDTO productoCarroDto=new ProductoCarroDTO();

		for (CarroDetalleDTO carroDetalleDTO : listaCarritoCompra) {
			for(ProductoCarroDTO productoCarroDTO2: listaProductoCarro){
				if(productoCarroDTO2.getIdProducto().equals(carroDetalleDTO.getIdProducto())){
					productoCarroDto.setCantidad(carroDetalleDTO.getCantidad());
			    	productoCarroDto.setSubTotal(productoDto.getPrecio()*carroDetalleDTO.getCantidad());
			    	encontro=true;
				}
			}
			if(encontro==false){
				productoDto = productoBeanLocal.obtenerProducto(carroDetalleDTO.getIdProducto());
		    	productoCarroDto=new ProductoCarroDTO();
		    	productoCarroDto.setIdProducto(productoDto.getCod_producto());
		    	productoCarroDto.setNombreProducto(productoDto.getNombre());
		    	productoCarroDto.setPrecio(productoDto.getPrecio());
		    	productoCarroDto.setCantidad(carroDetalleDTO.getCantidad());
		    	productoCarroDto.setSubTotal(productoDto.getPrecio()*carroDetalleDTO.getCantidad());
		    	listaProductoCarro.add(productoCarroDto);
			}
			
	    }
		return "editarCarro";
	}
	
	public void quitarProductoCarro(ProductoDTO productoCarro){
		
	}
	
	public void eliminarProductosCarro(ProductoDTO productoCarro){
		
	}
//	metodo incompleto, solo funciona el calculo del total que si es reflejado por pantalla
	public void agregarProductoEditado(ProductoCarroDTO productoCarro){
		total=0;
		boolean encontro=false;
		carroDetalleDto=new CarroDetalleDTO();
        		for (CarroDetalleDTO carroDetalleDTO : listaCarritoCompra) {
        			if(carroDetalleDTO.getIdProducto().equals(productoCarro.getIdProducto())){
        				carroDetalleDTO.setCantidad(carroDetalleDTO.getCantidad()+1);
        				contarProducto();
        				encontro=true;
        			}
				}
        	    if(encontro==false){
        	    	carroDetalleDto.setIdProducto(productoCarro.getIdProducto());
                	carroDetalleDto.setCantidad(1);
                	listaCarritoCompra.add(carroDetalleDto);
                	contarProducto();
        	    }
        calcularTotal();
	}
	
	public void comprar(){
		if(usuarioLogeado!=null && !(usuarioLogeado.getNombreUsuario().equals(""))){
			carroDto.setNombreUsuario(usuarioLogeado.getNombreUsuario());
			carroDto.setCompraFinalizada(1);
			carroDto.setFechaCompra(new Date());
			carroDto.setListaCarroDetalleDto(listaCarritoCompra);
			carroBeanLocal.comprar(carroDto,listaCarritoCompra);
		}
	}
	
	public String volver() {
        return "principal";
    }
	
	public UsuarioBeanLocal getUsuarioBeanLocal() {
		return usuarioBeanLocal;
	}

	public void setUsuarioBeanLocal(UsuarioBeanLocal usuarioBeanLocal) {
		this.usuarioBeanLocal = usuarioBeanLocal;
	}

	public ProductoBeanLocal getProductoBeanLocal() {
		return productoBeanLocal;
	}

	public void setProductoBeanLocal(ProductoBeanLocal productoBeanLocal) {
		this.productoBeanLocal = productoBeanLocal;
	}

	public List<UsuarioDTO> getListaUsuario() {
		return listaUsuario;
	}

	public void setListaUsuario(List<UsuarioDTO> listaUsuario) {
		this.listaUsuario = listaUsuario;
	}

	public List<ProductoDTO> getListaProducto() {
		return listaProducto;
	}

	public void setListaProducto(List<ProductoDTO> listaProducto) {
		this.listaProducto = listaProducto;
	}

	public UsuarioDTO getUsuarioDto() {
		return usuarioDto;
	}

	public void setUsuarioDto(UsuarioDTO usuarioDto) {
		this.usuarioDto = usuarioDto;
	}

	public CarroDetalleBeanLocal getCarroDetalleBeanLocal() {
		return carroDetalleBeanLocal;
	}

	public void setCarroDetalleBeanLocal(CarroDetalleBeanLocal carroDetalleBeanLocal) {
		this.carroDetalleBeanLocal = carroDetalleBeanLocal;
	}

	public CarroDetalleDTO getCarroDetalleDto() {
		return carroDetalleDto;
	}

	public void setCarroDetalleDto(CarroDetalleDTO carroDetalleDto) {
		this.carroDetalleDto = carroDetalleDto;
	}

	public UsuarioDTO getUsuarioLogeado() {
		return usuarioLogeado;
	}

	public void setUsuarioLogeado(UsuarioDTO usuarioLogeado) {
		this.usuarioLogeado = usuarioLogeado;
	}

	public CarroDTO getCarroDto() {
		return carroDto;
	}

	public void setCarroDto(CarroDTO carroDto) {
		this.carroDto = carroDto;
	}

	public List<CarroDetalleDTO> getListaCarritoCompra() {
		return listaCarritoCompra;
	}

	public void setListaCarritoCompra(List<CarroDetalleDTO> listaCarritoCompra) {
		this.listaCarritoCompra = listaCarritoCompra;
	}
	
	public CarroBeanLocal getCarroBeanLocal() {
		return carroBeanLocal;
	}

	public void setCarroBeanLocal(CarroBeanLocal carroBeanLocal) {
		this.carroBeanLocal = carroBeanLocal;
	}

	public int getCantidad() {
		return cantidad;
	}

	public void setCantidad(int cantidad) {
		this.cantidad = cantidad;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public List<ProductoCarroDTO> getListaProductoCarro() {
		return listaProductoCarro;
	}

	public void setListaProductoCarro(List<ProductoCarroDTO> listaProductoCarro) {
		this.listaProductoCarro = listaProductoCarro;
	}

	public List<ProductoDTO> getListaProductoCarrito() {
		return listaProductoCarrito;
	}

	public void setListaProductoCarrito(List<ProductoDTO> listaProductoCarrito) {
		this.listaProductoCarrito = listaProductoCarrito;
	}
	
}
